# define _CRT_SECURE_NO_WARNINGS
# define _CRT_SECURE_NO_WARNINGS
//#include<string.h>
//#include<assert.h>

//模拟实现strstr函数
//
//#include <stdio.h>
//char* my_strstr(const char* str1, const char* str2)
//{
//	char* p1 = NULL;
//	char* p2 = NULL;
//	char* cur = str1;
//	 if(str2=='\0')
//	 {
//		return (char*) str1;
//	 }
//	while (*cur != NULL)
//	{
//		p1 = cur;
//		p2 = str2;
//		while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
//		{
//			p1++;
//			p2++;
//		}
//		if (*p2 == '\0')
//		{
//			return cur;
//		}
//		cur++;
//	}
//	return NULL;
//}
//int main()
//{
//	char arr[] = "abbbbscy";
//	char str[] = "bbs";
//	char* ret=my_strstr(arr, str);
//	if (ret == NULL)
//	{
//		printf("没有找到\n");
//	}
//	else
//		printf("%s", ret);
//	return 0;
//}



//模拟实现strncat——拼接
//#include<stdio.h>
//char* my_strncat(char* str1, char* str2, size_t n)
//{
//	assert(str1, str2);
//	char* p1 = str1;
//	while (*str1 != '\0')
//	{
//		str1++;
//   }
//	while (n)
//	{
//		*str1++ =*str2++;
//		n--;
//	}
//	return p1;
//}
//int main()
//{
//	char arr[20] = "Hello,";
//	char arr1[] = "bit!";
//	char*ret=my_strncat(arr, arr1, 3);
//	printf("%s",ret);
//	return 0;
//}

//模拟实现memcpy
//#include<stdio.h>
//int main4()
//{
//	int arr[] = { 1,2,3,4,5,6 };
//	int arr1[20] = { 0 };
//	memcpy(arr1, arr, 20);
//	for (int i = 0; i < 5; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

//strlen的使用
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[100] = { "xiaowang,nihenhao" };
//	size_t ret = strlen(arr);
//	printf("%d ", ret);
//	return 0;
//}

//strlen 模拟实现——计算器的办法
//#include<stdio.h>
//int my_strlen(const char* str)//const——不改变我arr中的字符串内容
//{
//	size_t count = 0;
//	assert(str);//断言
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}
//int main()
//{
//	char arr[100] = "hello,nicwe";
//	size_t ret = my_strlen(arr);
//	printf("%d ", ret);
//	return 0;
//}

//方法二、不创建临时变量计数器
//#include<stdio.h>
//int my_strlen(const char* str)
//{
//	assert(str);
//	if (*str == '\0')
//		return 0;
//	else
//	{
//		return 1 + my_strlen(str + 1);
//	}
//}
//int main()
//{
//	char arr[100] = "hello,world!";
//	size_t ret = my_strlen(arr);
//	printf("%d ", ret);
//	return 0;
//}

//方法三、指针
//#include<stdio.h>
//int my_strlen(const char* str)
//{
//	assert(str);
//	char* p = str;
//	while (*p != '\0')
//	{
//		p++;
//	}
//	return p - str;
//}
//int main()
//{
//	char arr[100] = "hello world!";
//	size_t ret = my_strlen(arr);
//	printf("%d ", ret);
//	return 0;
//}

//strcpy函数的使用
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[] = "hello,";
//	char str[20] = { 0 };
//	strcpy(str,arr);
//	printf("%s ", str);
//	return 0;
//}

//strcpy函数的模拟实现
//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//char* my_strcpy(char* p1, const char* p2)
//{
//	assert(p1,p2);
//	char* str1 = p1;
//
//	//拷贝的是'\0'之前的字符
//
//	while (*p2 != '\0')
//	{
//		*p1++ = *p2++;
//	}
//	*p1 = '\0';//把'\0'拷贝到最后
//	return str1;
//}
//int main()
//{
//	char arr[20] = "hello";
//	char str[20] = { 0 };
//	char* ret = my_strcpy(str, arr);
//	printf("%s ", ret);
//	return 0;
//}

//strcat函数的使用
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[20] = "hello,";
//	char str[20] = "world";
//	strcat(arr, str);
//	printf("%s ", arr);
//	return 0;
//}

//strcat模拟函数实现
//#include<stdio.h>
//#include<assert.h>
//char* my_strcat(char* p1, const char* p2)
//{
//	assert(p1, p2);
//	char* str1 = p1;
//	while (*p1 != '\0')
//	{
//		p1++;
//	}
//	while (*p2 != '\0')
//	{
//		*p1++ = *p2++;
//	}
//	*p1 = '\0';
//	return str1;
//}
//int main()
//{
//	char arr[20] = "hello,";
//	char str[10] = "world";
//	char* ret = my_strcat(arr, str);
//	printf("%s ", ret);
//	return 0;
//}

//自己给自己追加？
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[200] = "hello,";
//	strcat(arr, arr);
//	printf("%s ", arr);
//	return 0;
//}

//对于上面的自己追加模拟实验——无法成功，程序可能栈溢出
//#include<stdio.h>
//#include<assert.h>
//char* my_strcat(char* p1, const char* p2)
//{
//	char* dest = p1;
//	assert(p1, p2);
//	while (*p1 != '\0')
//	{
//		p1++;
//	}
//	while (*p2 != '\0')
//	{
//		*p1++ = *p2++;
//	}
//	*p1 = '\0';
//	return dest;
//}
//int main()
//{
//	char arr[200] = "hello,";
//	char* ret = my_strcat(arr, arr);
//	printf("%s ", arr);
//	return 0;
//}

//strcmp函数的使用
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[20] = "adcgft";
//	char str[20] = "gdhuo";
//	int ret=strcmp(arr, str);
//	if (ret > 0)
//	{
//		printf("大的是%s ", arr);
//	}
//	else if (ret < 0)
//	{
//		printf("大的是%s ", str);
//	}
//	else
//		printf("一样大小\n");
//	return 0;
//}

//strcmp模拟实现

//#include<stdio.h>
//#include<string.h>
//#include<assert.h>
//int my_strcmp(const char* p1, const char* p2)
//{
//	assert(p1, p2);
//		while (*p1 ==*p2)
//		{
//			if (*p1 == '\0')
//				return 0;
//				p1++;
//				p2++;
//			
//		}
//		return *p1 - *p2;
//}
//int main()
//{
//	char arr[29] = "asdftgh";
//	char str[20] = "asdft";
//	int ret = my_strcmp(arr, str);
//	printf("%d \n", ret);
//	if (ret > 0)
//	{
//		printf("大的是%s \n", arr);
//	}
//	else if (ret < 0)
//	{
//		printf("大的是%s \n", str);
//	}
//	else
//		printf("一样大小\n");
//	return 0;
//}

//strncpy函数的使用

//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[20] = "hello,world";
//	char str[30] = { 0 };
//	strncpy(str, arr, 19);
//	printf("%s \n", str);
//	return 0;
//}

//strncpy函数的模拟实现
//
//#include<stdio.h>
//#include<assert.h>
//char* my_strncpy(char* p1, const char* p2,size_t n)
//{
//	assert(p1, p2);
//	char* dest = p1;
//	while (n&&*p1=='\0')
//	{
//		*p1 = *p2;
//		p1++;
//		p2++;
//		n--;
//	}
//	if (n > 0)
//	{
//		*p1 = '\0';
//	}
//	return dest;
//}
//int main()
//{
//	char arr[] = "helllow";
//	char str[20] = { 0 };
//	char* ret = my_strncpy(str, arr, 5);
//	printf("%s \n", ret);
//	return 0;
//}

//strncat函数的使用
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char arr[30] = "hello,";
//	char str[10] = "world,li";
//	strncat(arr, str, 5);
//	printf("%s ", arr);
//	return 0;
//}

//strncat函数的模拟实现
//#include<stdio.h>
//#include<assert.h>
//char* my_strncat(char* p1, char* p2, size_t m)
//{
//	assert(p1, p2);//断言——看传递是否是野指针
//	int* ret = p1;
//	while (*p1 != '\0')
//	{
//		p1++;
//	}
//	while (*p2 != '\0' && m != 0)
//	{
//		*p1 = *p2;
//		p1++;
//		p2++;
//		m--;
//	}
//	if (m > 0)
//	{
//		*p1 = '\0';
//	}
//	return ret;
//}
//int main()
//{
//	char arr[40] = "hello,";
//	char str[20] = "world,liming";
//	my_strncat(arr, str, 4);
//	printf("%s ", arr);
//	return 0;
//}

//strncmp函数的使用
//#include<stdio.h>
//int main()
//{
//	char arr[20] = "qieyouyou";
//	char str[20] = "qiekenao";
//	int ret=strncmp(arr, str, 5);
//	printf("%d ", ret);
//	return 0;
//}

//strncmp函数的模拟实现

//#include<stdio.h>
//#include<assert.h>
//int my_strncmp(const char* p1, const char* p2, size_t n)
//{
//	assert(p1, p2);
//	while (n != 0)
//	{
//		while (*p1 != '\0' && *p2 != '\0' && n != 0)
//		{
//			if (*p1 == *p2) 
//			{
//				p1++;
//				p2++;
//			}
//			n--;
//		}
//		return *p1 - *p2;
//	}
//	if (n == 0)
//	{
//		return 0;
//	}
//}
//int main()
//{
//	char arr[20] = "qieyouypou";
//	char str[20] = "qieyoumij";
//	int ret = my_strncmp(arr, str, 7);
//	printf("%d ", ret);
//	return 0;
//}